#include "PH.h"
pthread_t PH_ThreadId = 0;
float PH_value()
{
    float AD_val;
    AD_val = AD_work(A3) - A3_MV; //读取A0端口的电压值
    printf("%f\n", AD_val);
    AD_val = (-5.8887 * (AD_val / 1000)) + 21.677; //根据特定公式计算ph值
    return AD_val;
}

float AD_work(unsigned char channel)
{
    float AD_val;
    unsigned char i;
    for (i = 0; i < 100; i++)
        AD_val += analogRead(channel); //转换100次求平均值(提高精度)
    AD_val /= 100;
    AD_val = (AD_val * POWER) / 255; //AD的参考电压是单片机上的5v，所以乘5即为实际电压值
    return AD_val;
}

/*******************************************************************
** 函数名:     DOS_Thread
** 函数描述:   处理溶解氧传感器的进程
** 参数：      回调函数
********************************************************************/
void *PH_Thread(PH_cb RecvData_Cb)
{
    //设置线程对Cancel信号的反应
    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
    /*同步取消，等到下一个取消点再取消*/
    pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
    // pthread_detach(pthread_self()); //线程分离
 
    while (1)
    {
        float AD_val = PH_value();
        RecvData_Cb(AD_val);
        delay(1000);
        pthread_testcancel(); //设置取消点
    }
}

void PH_init(PH_cb RecvData_Cb)
{
    //设置pcf8591的器件地址
    pcf8591Setup(BA_SE, Address);
    if ((pthread_create(&PH_ThreadId, NULL, PH_Thread, RecvData_Cb)) == -1)
    {
        printf("创建溶解氧线程错误!\n");
    }
}